#include <iostream>
#include <algorithm>
#include "Contexto.h"

Contexto::Contexto(char valorAscii) {
	this->valorAscii = valorAscii;
	frecuenciaAcumulada = TAMANIO_DICCIONARIO;

}
char Contexto::getValorAscii() {
	return valorAscii;
}

cantBytes Contexto::getFrecuenciaAcumulada() {
	return frecuenciaAcumulada;
}

float Contexto::getProbabilidad(char simbolo) {
	cantBytes frecuencia = 1;
	unsigned i;

	for (i = 0; i < simbolos.size(); i++) {
		if (simbolos[i].getValorAscii() == simbolo) {
			frecuencia = simbolos[i].getFrecuencia();
			return (float) frecuencia / (frecuenciaAcumulada);
		}
	}

	return (float) frecuencia / (frecuenciaAcumulada);
}

void Contexto::actualizarFrecuencia(char simbolo) {
	/*busco el simbolo, si esta: frec++, sino lo agrego*/
	this->frecuenciaAcumulada++;
	unsigned i = 0;
	if (this->simbolos.size() != 0) {
		while ((i < simbolos.size()) && (simbolos[i] < simbolo)) {
			i++;
		}

		if ((i < simbolos.size()) && (simbolos[i] == simbolo)) {
			/*actualizo el valor de su frecuencia*/
			simbolos[i].actualizarFrecuencia();
			return;
		}
	}
	/*no esta en la tabla*/
	Simbolo simboloNuevo(simbolo);
	simboloNuevo.actualizarFrecuencia();
	simbolos.push_back(simboloNuevo);
	std::sort(simbolos.begin(), simbolos.end());

}
bool Contexto::operator<(const Contexto& contexto) const {
	return this->valorAscii < contexto.valorAscii;
}

bool Contexto::operator==(const Contexto& contexto) const {

	return this->valorAscii == contexto.valorAscii;
}

void Contexto::imprimir() {
	std::cout << "--------CONTEXTO--------------------------" << std::endl;
	std::cout << "Valor:             " << valorAscii << std::endl;
	std::cout << "frecuenciaAcum:    " << frecuenciaAcumulada << std::endl;
	std::cout << "Los simbolos------------" << std::endl;
	if (simbolos.size() == 0) {
		std::cout << "no tiene simbolos cargados" << std::endl;

	}
	for (unsigned i = 0; i < simbolos.size(); i++) {
		std::cout << "s:  " << simbolos[i].getValorAscii() << "  frec: "
				<< simbolos[i].getFrecuencia() << std::endl;
	}
	std::cout << "------------------------------------------" << std::endl;

}

Contexto::~Contexto() {
}
